package org.viva.service.wx.mp;

import java.util.Locale;
import java.util.Map;

import javax.annotation.Resource;

import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Service;
import org.viva.util.wx.AesException;
import org.viva.util.wx.HTTPUtils;
import org.viva.util.wx.WXBizMsgCrypt;

@Service("wxTokenService")
public class WxTokenService {

    public final String ACCESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%1$s&secret=%2$s";
    public final String JSAPI_TICKET_URL = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=%1$s&type=jsapi";
    public final String User_info_URL    = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=%1$s&openid=%2$s&lang=" + Locale.getDefault();

    @Resource
    private WxConfigServiceImpl weiXinConfigService;

    public String getAccessToken() {
        WXBizMsgCrypt bizMsgCrypt = weiXinConfigService.getWxBizMsgCrypt();
        String url = String.format(ACCESS_TOKEN_URL, bizMsgCrypt.getAppId(), bizMsgCrypt.getAppSecret());
        String text = null;
        Map<String, Object> map = HTTPUtils.getAccess_token(url);
        text = (String) map.get("access_token");
        if (StringUtils.isBlank(text)) {
            text = (String) map.get("errmsg");
        }
        return text;
    }

    public String getTicket() {
        String url = String.format(JSAPI_TICKET_URL, getAccessToken());
        String text = null;
        Map<String, Object> map = HTTPUtils.getAccess_token(url);
        text = (String) map.get("access_token");
        if (StringUtils.isBlank(text)) {
            text = (String) map.get("errmsg");
        }
        return text;
    }

    public boolean checkSignature(String signature, String timestamp, String nonce) {
        WXBizMsgCrypt bizMsgCrypt = weiXinConfigService.getWxBizMsgCrypt();
        return MPAPI.verifyUrl(bizMsgCrypt.getToken(), signature, timestamp, nonce);
    }

    // public Map<String, Object> getUserInfo() {
    // WXBizMsgCrypt build = weiXinConfigService.getWxBizMsgCrypt();
    // try {
    // Map<String, Object> respMap = build.decryptXMLMsg();
    // String OpenID = respMap.get("FromUserName").toString(); // OpenID
    //
    // String respstr = HTTPUtils.doGet(String.format(this.User_info_URL,
    // this.getAccessToken(), OpenID));
    // Map<String, Object> userInfoMap = JSONObject.fromObject(respstr);
    // // Log.debug("反回的用户信息 : "+userInfoMap);
    // if (StringUtils.isNotBlank((String) userInfoMap.get("errmsg"))) {
    // userInfoMap.put("errmsg", "用户信息获取失败！" + userInfoMap.get("errmsg"));
    // return userInfoMap;
    // }
    // String subscribe = userInfoMap.get("subscribe").toString();
    // if ("0".equals(subscribe)) {
    // userInfoMap = new HashMap<String, Object>();
    // userInfoMap.put("errmsg", "用户没有关注该公众号！");
    // return userInfoMap;
    // }
    // // userInfoMap.forEach((key, val) ->
    // // {log.debug(String.format("%1$20s : %2$s",key , val.toString()));
    // // });
    // for (Map.Entry<String, Object> m : userInfoMap.entrySet()) {
    // Log.debug(String.format("%1$20s : %2$s", m.getKey(),
    // m.getValue().toString()));
    // }
    //
    // // String subscribe_time =
    // // userInfoMap.get("subscribe_time").toString();
    // // Object unionid = userInfoMap.get("unionid");// 公众号下唯一
    //
    // // Map<String, Object> sysUserMap = this.accDao.findWXUser( OpenID
    // // ,unionid ,subscribe_time);
    // // if(sysUserMap == null || sysUserMap.isEmpty()){
    // // boolean ok = this.accDao.addWXUser(userInfoMap);
    // // if( !ok){
    // // userInfoMap = new HashMap<String,Object>();
    // // userInfoMap.put("errmsg", "用户还没有关联系统账号！");
    // // return userInfoMap;
    // // }
    // // userInfoMap.put("newuser", "1");
    // // Log.debug("加了用户："+userInfoMap);
    // // return userInfoMap;
    // // }
    // return null;
    //
    // } catch (Exception e) {
    // e.printStackTrace();
    // }
    //
    // return Collections.emptyMap();
    // }

}
